package info.sean.config;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
public class ExecutorConfig {

    private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);


      @Value("${async.executor.thread.core_pool_size}")
      private  int corePoolSize;

      @Value("${async.executor.thread.max_pool_size}")
      private int maxPoolSize;

      @Value("${async.executor.thread.queue_capacity}")
      private int queueCapacity;

      @Value("${async.executor.thread.name.prefix}")
      private String namePrefix;

      @Bean(name = "asyncServiceExecutor")
    public Executor asyncServiceExecutor(){
          logger.info("开始：start asyncServiceExecutor");
//          ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
          ThreadPoolTaskExecutor threadPoolTaskExecutor = new VisiableThreadPoolTaskExecutor();
          //配置核心线程数
         threadPoolTaskExecutor.setCorePoolSize(corePoolSize);
         //配置最大线程树
         threadPoolTaskExecutor.setMaxPoolSize(maxPoolSize);
        //配置队列大小
          threadPoolTaskExecutor.setQueueCapacity(queueCapacity);
          // 配置线程中的线程名称前缀
          threadPoolTaskExecutor.setThreadNamePrefix(namePrefix);

          // rejection-policy：当pool已经达到max size的时候，如何处理新任务
          // CALLER_RUNS：不在新线程中执行任务，而是有调用者所在的线程来执行
           threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
           //执行初始化
          threadPoolTaskExecutor.initialize();
          return threadPoolTaskExecutor;

      }

}
